package com.cm.etax.tianjin;

import com.cm.etax.BaseEtax;
import com.cm.etax.FunctionResult;
import com.cm.rpa.config.RpaConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;

/**
 * 天津市电子税务局交互处理对象
 *
 * @author LWang 2023.01.29
 * @since 1.0.0
 */
@Slf4j
public class Tianjin extends BaseEtax {

    private static final String TIANJIN_CONFIG = "etax/tianjin.yaml";

    /**
     * 天津市电子税务局对象构造方法
     *
     * @param rpaConfig rpa 配置
     */
    public Tianjin(RpaConfig rpaConfig) {
        this(rpaConfig, TIANJIN_CONFIG);
    }

    /**
     * 天津市电子税务局对象构造方法
     *
     * @param rpaConfig      rpa 配置
     * @param etaxConfigPath 电子税务局配置地址
     */
    public Tianjin(RpaConfig rpaConfig, String etaxConfigPath) {
        super(rpaConfig, etaxConfigPath);
        if (!rpa().isCreate()) {
            rpa().create();
        }
    }

    /**
     * 电子税务局登录
     *
     * @param taxFileNo      税号
     * @param personId       办税人 ID
     * @param personPassword 办税人密码
     * @return 登录操作结果
     */
    public FunctionResult<Object> login(String taxFileNo, String personId, String personPassword) {
        // 1. 登录状态判断，
        var sessionUser = this.function(SessionFunction.class).getSessionUser(true);
        if (!Objects.isNull(sessionUser)) {
            // 判断当前登录用户是否与要登录的用户一致
            if (Objects.equals(sessionUser.userName(), personId)) {
                if (Objects.equals(taxFileNo, sessionUser.taxFileNo())) {
                    return new FunctionResult<>(true, "登录成功。", null);
                }
                // 尝试切换企业
                if (this.function(SwitchTaxpayerFunction.class).switchTaxpayer(taxFileNo).success()) {
                    return new FunctionResult<>(true, "登录成功。", null);
                }
            }
        }
        return this.function(LoginFunction.class).login(taxFileNo, personId, personPassword);
    }

    /**
     * 查询自然人绑定企业信息
     *
     * @param personId       自然人账号
     * @param personPassword 自然人密码
     * @return 查询结果
     */
    public FunctionResult<List<String>> queryEnterpriseInHuman(String personId, String personPassword) {
        var loginResult = this.function(HumanLoginFunction.class).login(personId, personPassword);
        if (!loginResult.success()) {
            return new FunctionResult<>(false, loginResult.message(), null);
        }
        return this.function(QueryBindEnterpriseFunction.class).queryBindEnterprise();
    }

    /**
     * 查询纳税人完税凭证
     *
     * @param taxFileNo      纳税人识别号
     * @param personId       办税人账号
     * @param personPassword 办税人密码
     * @param taxpayerId     登记序号
     * @param startDate      查询开始时间
     * @param endDate        查询终止时间
     * @return 提交到 OSS 中的文件编号
     */
    public FunctionResult<String> queryDutyPaidProof(String taxFileNo, String personId, String personPassword, String taxpayerId, String startDate, String endDate) {
        // 当前发票需要办税类角色
        this.setRole(ROLE_TYPE_TAX);
        // 1. 登录
        var result = login(taxFileNo, personId, personPassword);
        if (!result.success()) {
            // 登录失败直接返回
            return new FunctionResult<>(false, result.message(), null);
        }
        // 2. 查询完税证明，并返回结果
        return this.function(QueryDutyPaidProofFunction.class).queryDutyPaidProof(taxpayerId, startDate, endDate);
    }
}
